#include "../Interfaces/DistritoABM.h"
#include <limits>

using namespace ABM;

//Cuando llamo al constructor de IAbm , le seteo el nombre del ABM en el que estoy.
DistritoABM::DistritoABM() :
	IAbm("Distrito") {
	this->manejadorDistrito = new ManejadorDistrito();
}

bool DistritoABM::altaInterna(string nombre) {
	Distrito* distrito = new Distrito();
	nombre = Utils::aMinuscula(nombre);
	distrito->setNombre(nombre);
	bool resultado = this->manejadorDistrito->alta(distrito);

	delete distrito;
	return resultado;
}

bool DistritoABM::alta() {

	string nombreDistrito;
	cout << "Ingrese el Distrito: ";
	getline(cin, nombreDistrito);
	nombreDistrito = Utils::aMinuscula(nombreDistrito);
	return altaInterna(nombreDistrito);

}

bool DistritoABM::baja() {

	Distrito* distrito = new Distrito();

	string nombreDistrito;
	cout << "Ingrese el Distrito: ";
	getline(cin, nombreDistrito);
	nombreDistrito = Utils::aMinuscula(nombreDistrito);
	distrito->setNombre(nombreDistrito);

	bool resultado = manejadorDistrito->baja(distrito);

	delete distrito;

	return resultado;
}

bool DistritoABM::modificacion() {

	bool resultado;
	Distrito* distrito = new Distrito();
	ManejadorDistrito* manejadorDistrito = new ManejadorDistrito();

	string nombreDistrito;
	cout << "Ingrese el Distrito: ";
	getline(cin, nombreDistrito);
	nombreDistrito = Utils::aMinuscula(nombreDistrito);
	distrito->setNombre(nombreDistrito);

	string nombreDistritoModificado;
	cout << "Ingrese el Nuevo nombre del Distrito: ";
	getline(cin, nombreDistritoModificado);
	nombreDistritoModificado = Utils::aMinuscula(nombreDistritoModificado);
	if (nombreDistrito != nombreDistritoModificado) {
		if (this->manejadorDistrito->existe(nombreDistrito)) {
			Distrito* distritoNuevo = new Distrito();
			distritoNuevo->setNombre(nombreDistritoModificado);
			resultado = manejadorDistrito->modificacion(distrito, distritoNuevo);
			delete distritoNuevo;
		} else
			resultado = false;
	} else
		resultado = false;

	delete distrito;

	return resultado;

}

void DistritoABM::altaMasiva() {
	ArchivoAltasMasivas* arch = new ArchivoAltasMasivas("distritosCargaMasiva.txt");

	string linea;
	linea = arch->leerLinea();
	while (!arch->finDeArchivo()) {
		Parser::reemplazarCaracter(&linea, separadorPalabras, blanco);
		altaInterna(Utils::aMinuscula(linea));
		linea = arch->leerLinea();
		this->log->escribir("Se genero Alta Masiva de Distrito.");
	}

	delete arch;
}

bool DistritoABM::listar(){
	bool listOK= false;
	if (this->manejadorDistrito->listarTodos()){
		system("chmod 755 ../TPVotoElectronico/Reportes/ListadoDistritos.txt");
		system("gedit ../TPVotoElectronico/Reportes/ListadoDistritos.txt");
		listOK = true;
	}else{
		cout << "No se encuentra ningun Listado de Distritos." << endl;
		cout << "Asegurese que se encuentran Distritos cargados" << endl;
	}
	return listOK;
}

DistritoABM::~DistritoABM() {

	delete this->manejadorDistrito;
}
